// Copyright 2022 The Parca Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import {useQuery, type UseQueryResult} from '@tanstack/react-query';

interface Props<IRes> {
  key: unknown[];
  queryFn: (signal?: AbortSignal) => Promise<IRes>;
  options?: {
    enabled?: boolean | undefined;
    staleTime?: number | undefined;
    retry?: number | boolean;
    keepPreviousData?: boolean | undefined;
    cacheTime?: number | undefined;
  };
}

const useGrpcQuery = <IRes>({
  key,
  queryFn,
  options: {enabled = true, staleTime, retry, keepPreviousData, cacheTime} = {},
}: Props<IRes>): UseQueryResult<IRes> => {
  return useQuery<IRes>(
    key,
    async ({signal}) => {
      return await queryFn(signal);
    },
    {
      enabled,
      staleTime,
      retry,
      keepPreviousData,
      cacheTime,
    }
  );
};

export default useGrpcQuery;
